Legacy Texture Combiners(传统的纹理合成)

  在计算基本顶点照明后,应用纹理。在ShaderLab,这是通过使用SetTexture命令。

注意:当片段程序使用时,SetTexture命令没有效果;建议使用可编程着色器替代SetTexture命令。

  固定功能纹理用于传统风格的组合效果。你可以在一个Pass中有多个SetTexture命令,所有纹理被顺序的应用,如绘图程序的层。SetTexture命令必须放在Pass的最后。

  语法:

    SetTexture [TextureName] {Texture Block}

  分配一个纹理。TextureName必须定义为一个纹理属性。如何应用一个在纹理块内定义的纹理。

  纹理块控制纹理的应用。在纹理块内可以有两个命令:combine和constantColor。


纹理块组合命令 说明
combine src1 * src2 src1 乘 src2,结果是比每个单独的输入要暗。
combine src1 + src2 src1 加 src2,结果是比每个单独的输入亮。
combine src1 - src2 src1 减 src2。
combine src1 lerp (src2) src3 使用src2的alpha值在src3和src1之间插值。注意,插值是相反的方向:当alpha是1的时候是src1,当alpha是0的时候使用src3。
combine src1 * src2 + src3 src1 乘 scr2的alpha,然后加src3。

所有的src属性可以是previous、constant、primary或texture其中之一。

    Previous 是之前SetTexture的结果。        
    Primary 是从照明计算或顶点颜色的颜色。    
    Texture 纹理是在SetTexture TextureName指定纹理的颜色(见上图)。
    Constant 是ConstantColor指定的颜色。

  修饰符:

  上述公式可由Double或Quad使得颜色亮度2倍或4倍。

  所有的src属性的值,除了lerp,可以选择其中之一。

  所有的src属性可以跟一个alpha用来只使用alpha通道。


  Texture 块 constantColor 命令:

  ConstantColor color: 定义了一个固定颜色,可用于组合命令。

固定功能在Unity 5.0移除。

Unity版本在5之前确实支持纹理坐标转换,在纹理块内使用矩阵命令。如果你现在需要这个功能,考虑重写你的着色器作为可编程着色器代替,并在顶点着色器中进行UV变换。

同样,Unity5删除纹理相结合的模式。如果需要,请在像素着色器中做数学运算。


  细节:

  片段程序存在之前,旧的图形卡使用分层的纹理方法。纹理被一个接一个地应用,修改将被写入屏幕的颜色。对于每个纹理,纹理通常与前一个操作的结果相结合。所以使用实际的片段程序是明智的。

请注意,每个纹理阶段可能会或可能不会被限制到0~1的范围内,这取决于平台。这可能会影响SetTexture阶段,可以产生大于1的值。


  单独的 Alpha & Color 计算

  默认情况下,合并公式用于计算颜色的RGB和alpha分量。可选地,可以指定alpha计算的单独公式。这看起来像这样:

    SetTexture [_MainTex] 
    { 
        combine previous * texture, previous + texture 
    }

  在这里,我们RGB颜色相乘和叠加alpha。

  高光:

  默认情况下,原色是漫反射、环境和镜面颜色的总和(如照明计算中定义的)。如果你将通道设置中的SeparateSpecular打开,镜面的颜色将被添加在合并计算后,而不是之前。这是内置顶点着色器的默认行为。

  图形硬件的支持

  片段着色器支持现代图形卡(“Shader Model 2的桌面上,OpenGL ES 2移动)支持所有SetTexture模式和至少4个纹理贴图(他们中的许多人支持8)。如果你真的在很老的硬件上运行(前2003 PC,或在iPhone3GS手机),你可能有两个纹理阶段。着色器作者要写他或她想要支持的卡分开着色器。


例如:

  Alpha 混合两个纹理

  这个小例子需要两个纹理。第一集的第一组合是以_maintex,然后利用_blendtex Alpha通道在_blendtex RGB颜色褪色

  这个小例子有两个纹理。第一集第一组合器取_MainTex,然后使用alpha通道_BlendTex淡入_BlendTex的RGB颜色

    Shader "Examples/2 Alpha Blended Textures" {
        Properties {
            _MainTex ("Base (RGB)", 2D) = "white" {}
            _BlendTex ("Alpha Blended (RGBA) ", 2D) = "white" {}
        }
        SubShader {
            Pass {
                // Apply base texture
                SetTexture [_MainTex] {
                    combine texture
                }
                // Blend in the alpha texture using the lerp operator
                SetTexture [_BlendTex] {
                    combine texture lerp (texture) previous
                }
            }
        }
    }

  Alpha控制自发光

  这个着色器使用的_maintex alpha分量来决定在哪里使用照明。它通过将纹理应用到两个阶段,在第一阶段中,纹理的alpha值被用来在顶点颜色和实心颜色之间进行混合。在第二阶段,乘以纹理的RGB值。

    Shader "Examples/Self-Illumination" {
        Properties {
            _MainTex ("Base (RGB) Self-Illumination (A)", 2D) = "white" {}
        }
        SubShader {
            Pass {
                // Set up basic white vertex lighting
                Material {
                    Diffuse (1,1,1,1)
                    Ambient (1,1,1,1)
                }
                Lighting On

                // Use texture alpha to blend up to white (= full illumination)
                SetTexture [_MainTex] {
                    constantColor (1,1,1,1)
                    combine constant lerp(texture) previous
                }
                // Multiply in texture
                SetTexture [_MainTex] {
                    combine previous * texture
                }
            }
        }
    }

    Shader "Examples/Self-Illumination 2" {
        Properties {
            _IlluminCol ("Self-Illumination color (RGB)", Color) = (1,1,1,1)
            _MainTex ("Base (RGB) Self-Illumination (A)", 2D) = "white" {}
        }
        SubShader {
            Pass {
                // Set up basic white vertex lighting
                Material {
                    Diffuse (1,1,1,1)
                    Ambient (1,1,1,1)
                }
                Lighting On

                // Use texture alpha to blend up to white (= full illumination)
                SetTexture [_MainTex] {
                    // Pull the color property into this blender
                    constantColor [_IlluminCol]
                    // And use the texture's alpha to blend between it and
                    // vertex color
                    combine constant lerp(texture) previous
                }
                // Multiply in texture
                SetTexture [_MainTex] {
                    combine previous * texture
                }
            }
        }
    }

  在顶点照明着色器中使用所有的照明属性:

    Shader "Examples/Self-Illumination 3" {
        Properties {
            _IlluminCol ("Self-Illumination color (RGB)", Color) = (1,1,1,1)
            _Color ("Main Color", Color) = (1,1,1,0)
            _SpecColor ("Spec Color", Color) = (1,1,1,1)
            _Emission ("Emmisive Color", Color) = (0,0,0,0)
            _Shininess ("Shininess", Range (0.01, 1)) = 0.7
            _MainTex ("Base (RGB)", 2D) = "white" {}
        }

        SubShader {
            Pass {
                // Set up basic vertex lighting
                Material {
                    Diffuse [_Color]
                    Ambient [_Color]
                    Shininess [_Shininess]
                    Specular [_SpecColor]
                    Emission [_Emission]
                }
                Lighting On

                // Use texture alpha to blend up to white (= full illumination)
                SetTexture [_MainTex] {
                    constantColor [_IlluminCol]
                    combine constant lerp(texture) previous
                }
                // Multiply in texture
                SetTexture [_MainTex] {
                    combine previous * texture
                }
            }
        }
    }

🔚